package dao;

import java.sql.SQLException;
import java.util.List;
import om.Orte;
import om.Region;
import om.Route;


import org.hibernate.HibernateException;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;



/**
 * Die Klasse Orte. Alle Interaktionen mit der Datenbank
 * in Bezug auf die Entity Bean Orte sollten in dieser Klasse behandelt werden.
 */
public class OrteDao extends HibernateDaoSupport {
	
	
	/**
	 * Rueckgabewert sind alle Orte aus der Datenbank
	 * @return Eine Liste aller Orte
	 * @see Orte
	 */	
	public List<Orte> getAllOrte(){
		HibernateTemplate template = getHibernateTemplate();
		return template.loadAll(Orte.class);
	}
	
	/**
	 * Rueckgabewert ist ein einzelner Ort anhand seines Primaerschluessels
	 * @param id ist der Primaerschluessel {@link Orte}
	 * @return Ein Objekt vom Typ Orte
	 */
	public Orte findOrteById(int id){
		HibernateTemplate template = getHibernateTemplate();
		return template.get(Orte.class, id);	
	}
	
	
	/**
	 * Rueckgabewert ist eine Liste aller Orte die zu einer Region gehoeren
	 * @param id Es wird anhand der id der Datensatz der Region bestimmt {@link Region}
	 * @return Eine Liste aller Orte die zu einer Region gehoeren
	 */
	@SuppressWarnings("unchecked")
	public List<Orte> findOrteByRegion(final Integer id){
		HibernateTemplate template = getHibernateTemplate();
		return (List<Orte>) template.execute(new HibernateCallback<Object>() {
	
			@Override
			public Object doInHibernate(final org.hibernate.Session session)
					throws HibernateException, SQLException {
	
				final Region region = (Region) session.load(Region.class, id);
				final List<Orte> list = (List<Orte>) session.createCriteria(Orte.class)
						.add(Restrictions.eq("fs_regionid", region))
						.list();
				return list;
			}
		});
	}
	
	
	/**
	 * Rueckgabewert sind alle Orte deren Namen die Wildcard-Suche beinhalten
	 * @param suche Eine vom User eingegebene Suche (wildcards)
	 * @return Alle Orte deren Namen die Wildcard-Suche beinhalten
	 */
	@SuppressWarnings("unchecked")
	public List<Orte> findOrteBySearch(final String suche){
		final String suche1;
		
		suche1="%"+suche+"%";
		
		HibernateTemplate template = getHibernateTemplate();
		return (List<Orte>) template.execute(new HibernateCallback<Object>() {
	
			@Override
			public Object doInHibernate(final org.hibernate.Session session)
					throws HibernateException, SQLException {
	
				final List<Orte> list = (List<Orte>) session.createCriteria(Orte.class)
						.add(Restrictions.ilike("stadt", suche1))
						.list();
				return list;
			}
		});
	}
	
	/**
	 * Speichert ein {@link Orte} Objekt
	 * @param ort Objekt vom Type Orte
	 * @param id {@link Region} Dazugehoerige Region zum Ort
	 */
	public Orte save(Orte ort, Integer id){
		
		HibernateTemplate template = getHibernateTemplate();
		Region region = template.get(Region.class, id);
		ort.setFs_regionid(region);
		template.saveOrUpdate(ort);
		return ort;
	}

	/**
	 * Loescht ein bestimmtes {@link Orte} Objekt aus der Datenbank
	 * @param ort Der Ort der geloescht werden soll
	 * @param routen Eine Liste von Routen die den Ort beinhalten
	 * @throws DaoException Wenn der bestimmte Ort noch in einer Route vorhanden ist
	 */
	public void delete(Orte ort, List<Route> routen) throws DaoException {
		HibernateTemplate template = getHibernateTemplate();
		
		if (routen.size() == 0) {
			template.delete(ort);
		} else {
			throw new DaoException("Der Ort kann nicht gel�scht werden, da immernoch Routen f�r diesen Ort bestehen.");
		}
	}



}
